﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using SIMA.Core.Data.Access;
using SIMA.Core.Data.Collection;
using SIMA.Controls;
using SIMA.Core.Enums;
using System.Collections.ObjectModel;
using SIMA.Entities;

namespace SIMA.Client.Auxiliars.MVVM
{
    public class AdminTipoMantenimientoPorEquipoMvvm:AccessClass<T_C_TipoMantenimientoPorEquipo>
    {
        #region Consts

        private const string SPSELECTACTIVEEQUIPO = "SelectActiveEquipo";
        private const string SPSELECTACTIVETIPO = "SelectActiveTipoMovimiento";
        private const int IDESTADO = 16;

        #endregion

        #region Fields

        private SmartContainer<T_C_Equipo> equiposSmart;
        private SmartContainer<T_C_TipoMantenimiento> mantenimientosSmart;
        private SmartContainer<T_C_TipoMantenimientoPorEquipo> tipoMantenimientoPorEquipoSmart;
        private ObservableCollection<T_C_Equipo> equipos;
        private ObservableCollection<T_C_TipoMantenimiento> tipoMantenimientos;
        private ObservableCollection<T_C_TipoMantenimiento> tipoMantenimientoPorEquipo;
        private T_C_Equipo equipoSeleccionado;
        private T_C_TipoMantenimiento tipoMantenimientoSeleccionadoQuitar;
        private T_C_TipoMantenimiento tipoMantenimientoSeleccionado;

        #endregion

        #region Properties

        public ObservableCollection<T_C_Equipo> Equipos
        {
            get
            {
                return equipos;
            }
            set
            {
                equipos = value;
                this.RaisePropertyChanged("Equipos");
            }
        }

        public ObservableCollection<T_C_TipoMantenimiento> TipoMantenimientos
        {
            get
            {
                return tipoMantenimientos;
            }
            set
            {
                tipoMantenimientos = value;
                this.RaisePropertyChanged("TipoMantenimientos");
            }
        }

        public ObservableCollection<T_C_TipoMantenimiento> TipoMantenimientoPorEquipo
        {
            get
            {
                return tipoMantenimientoPorEquipo;
            }
            set
            {
                tipoMantenimientoPorEquipo = value;
                this.RaisePropertyChanged("TipoMantenimientoPorEquipo");
            }
        }

        public T_C_Equipo EquipoSeleccionado
        {
            get
            {
                return equipoSeleccionado;
            }
            set
            {
                equipoSeleccionado = value;
                this.RaisePropertyChanged("EquipoSeleccionado");
                if (mantenimientosSmart != null)
                {
                    TipoMantenimientos = new ObservableCollection<T_C_TipoMantenimiento>(mantenimientosSmart[SPSELECTACTIVETIPO, CommandType.StoredProcedure]);
                }
            }
        }

        public T_C_TipoMantenimiento TipoMantenimientoSeleccionadoQuitar
        {
            get
            {
                return tipoMantenimientoSeleccionadoQuitar; ;
            }
            set
            {
                if (value != null)
                {
                    tipoMantenimientoSeleccionadoQuitar = value;
                    this.RaisePropertyChanged("TipoMantenimientoSeleccionadoQuitar");
                }
            }
        }

        public T_C_TipoMantenimiento TipoMantenimientoSeleccionado
        {
            get
            {
                return tipoMantenimientoSeleccionado;
            }
            set
            {
                if (value != null)
                {
                    tipoMantenimientoSeleccionado = value;
                    this.RaisePropertyChanged("TipoMantenimientoSeleccionado");
                }
            }
        }

        #endregion

        #region Constructor

        public AdminTipoMantenimientoPorEquipoMvvm()
        {
            Init();
            tipoMantenimientoPorEquipo = new ObservableCollection<T_C_TipoMantenimiento>();
        }

        #endregion

        #region Private Methods

        private void Init()
        {
            DataAccess.SetConnection(AccessType.FromString, CADCONNECTIONSTRING);
            equiposSmart = new SmartContainer<T_C_Equipo>(true);
            tipoMantenimientoPorEquipoSmart = new SmartContainer<T_C_TipoMantenimientoPorEquipo>();
            tipoMantenimientoPorEquipoSmart.Failed += new EventHandler<SIMA.Core.EventArgs.FailedEventArgs>(tipoMantenimientoPorEquipoSmart_Failed);
            mantenimientosSmart = new SmartContainer<T_C_TipoMantenimiento>(true);
            equiposSmart.Failed += new EventHandler<SIMA.Core.EventArgs.FailedEventArgs>(equiposSmart_Failed);
            Equipos = new ObservableCollection<T_C_Equipo>(equiposSmart[SPSELECTACTIVEEQUIPO, CommandType.StoredProcedure]);

        }

        void tipoMantenimientoPorEquipoSmart_Failed(object sender, SIMA.Core.EventArgs.FailedEventArgs e)
        {
            SIMAMessageBox.Show(e.InstantFailed.ToLongTimeString(), e.ExceptionOcurred.Message, e.ExceptionOcurred.StackTrace, SIMAMessageBoxButtons.OK, SIMAMessageBoxImage.Error);
        }

        void equiposSmart_Failed(object sender, SIMA.Core.EventArgs.FailedEventArgs e)
        {
            SIMAMessageBox.Show(e.InstantFailed.ToLongTimeString(), e.ExceptionOcurred.Message, e.ExceptionOcurred.StackTrace, SIMAMessageBoxButtons.OK, SIMAMessageBoxImage.Error);
        }

        #endregion

        #region Public Methods

        public void AgregarATIpoMantenimientoPorEquipo()
        {
            TipoMantenimientos.Remove(TipoMantenimientoSeleccionado);
            TipoMantenimientoPorEquipo.Add(tipoMantenimientoSeleccionado);
        }

        public void QuitarTipoMantenimientoPorEquipo()
        {
            TipoMantenimientoPorEquipo.Remove(TipoMantenimientoSeleccionadoQuitar);
            TipoMantenimientos.Add(TipoMantenimientoSeleccionadoQuitar);
        }

        public override void Register(T_C_TipoMantenimientoPorEquipo item)
        {
            tipoMantenimientoPorEquipoSmart.Add(item);
        }

        public override void SelectAll()
        {
            throw new NotImplementedException();
        }

        public void Grabar()
        {
            foreach (T_C_TipoMantenimiento tipMan in TipoMantenimientoPorEquipo)
            {
                T_C_TipoMantenimientoPorEquipo tipManEquip = new T_C_TipoMantenimientoPorEquipo();
                tipManEquip.Id_Equipo = EquipoSeleccionado.Id_Equipo;
                tipManEquip.Id_TipoMantenimiento = tipMan.Id_Tipo;
                tipManEquip.Id_Tipo = tipMan.Id_Tipo;
                //tipManEquip.Id_Estado = IDESTADO;
                Register(tipManEquip);
            }
            SIMAMessageBox.Show(DateTime.Now.ToShortTimeString(), "Grabación Exitosa", SIMAMessageBoxButtons.OK, SIMAMessageBoxImage.Information);
        }

        #endregion

        #region Destructor

        ~AdminTipoMantenimientoPorEquipoMvvm()
        {
            this.Dispose();
        }

        #endregion


        public override void Delete(T_C_TipoMantenimientoPorEquipo item)
        {
            throw new NotImplementedException();
        }

        public override void Update(T_C_TipoMantenimientoPorEquipo itemToUpdate, T_C_TipoMantenimientoPorEquipo itemUpdated)
        {
            throw new NotImplementedException();
        }
    }
}
